CLCK 04: Настройка пользователей

Описание:

Еще один немаловажный файл для настройки кликхаус сервера - это users.xml, который лежит в директории /etc/clickhouse-server/. В нем можно добавить пользователей, настроить для них профили и квоты. Но в этом задании мы начнем с создания пользователей.

Структура конфигурации пользователей выглядит следующим образом:

<yandex>
<users>
<user_name>
 <password></password>
 <!-- Или -->
 <password_sha256_hex></password_sha256_hex>
 <access_management>0|1</access_management>
 <networks incl="networks" replace="replace">
<ip>::1</ip>
<ip>0.0.0.0</ip>
<host>host.example.com</host>
<host_regexp>.*\.example\.com$</host_regexp>
 </networks>
 <profile>profile_name</profile>
 <quota>default</quota>
 <databases>
 <database_name>
 <table_name>
 <filter>role = 'user'</filter>
 <table_name>
 </database_name>
 </databases>
 </user_name>
</users>
</yandex>

<user_name>

Имя пользователя. Если оно не указано, то будет использоваться пользователь default.

Пароль пользователя. Может быть пустым. Пароли хранятся либо в текстовом варианте, либо в хэшированом (sha256, double_sha1). Мы рекомендуем использовать хешированный вариант записи, чтобы при получении доступа к серверу было невозможно прочитать конфигурационный файл и получить пароль в открытом виде.

<access_management>

Параметр, который отвечает за управление доступом для пользователя, подобно MySQL. По факту разрешает данному пользователю управление другими пользователями. По-умолчанию данная опция выключена (0).

Список сетей, из которых пользователь может подключиться к ClickHouse. Обычно доступ пользователям разрешается со всех айпи адресов, поскольку безопасность по сети регулируются ее приватностью и настройкой фаервола. То есть мы советуем выделять кластер кликхауса в отдельуню приватную сеть с запретом доступа всем, кроме разрешенных хостов, а для разработчиков и административных пользователей советуем использовать VPN.

Профиль для указаного пользователя. Профили конфигурируются в отдельной секции файла users.xml. Их мы рассмотрим в следующем задании.

Квоты для указанного пользователя. Квоты конфигурируются в отдельной секции файла users.xml. Их мы так же рассмотрим в следующем задании.

Позволяет ограничить выдачу данных запросом SELECT для пользователя. Этот параметр содержит список баз и таблиц (database_name и table_name в примере), к которым будут применяться ограничения. Параметр filter содержать выражение любого вида, которое возвращает число. Строки в ответе на запрос, для которых фильтр возвращает 0 не будут отображаться в конечном запросе.

Давайте попробуем создать нашего пользователя и попробовать настроить для него фильтрацию строк из нашей таблицы. Для начала создадим таблицу и занесем в нее некоторые данные:

ch1.ru-central1.internal :) create database logs;
ch1.ru-central1.internal :) create table logs.data (ev DateTime, a Int, role String) ENGINE MergeTree PARTITION BY toYYYYMM(ev) ORDER BY ev;
ch1.ru-central1.internal :) insert into logs.data values ('2021-03-09T12:00:00', 1, 'admin');
ch1.ru-central1.internal :) insert into logs.data values ('2021-03-09T12:01:00', 2, 'user');
ch1.ru-central1.internal :) insert into logs.data values ('2021-03-09T12:02:00', 3, 'test');
ch1.ru-central1.internal :) select * from data;
┌──────────────────ev─┬─a─┬─role──┐
│ 2021-03-09 12:00:00 │ 1 │ admin │
└─────────────────────┴───┴───────┘
┌──────────────────ev─┬─a─┬─role─┐
│ 2021-03-09 12:01:00 │ 2 │ user │
└─────────────────────┴───┴──────┘
┌──────────────────ev─┬─a─┬─role─┐
│ 2021-03-09 12:02:00 │ 3 │ test │
└─────────────────────┴───┴──────┘
3 rows in set. Elapsed: 0.003 sec.
ch1.ru-central1.internal :)

Итак, в начале мы создали базу данных logs, а потом таблицу data внутри этой базы. Таблица у нас достаточно простая и содержит всего лишь три колонки - время события, числовое значение события и role - строку. После создания мы сразу же добавили три строки в нашу таблицу.

Давайте теперь создадим пользователя test без пароля и попробуем разрешить ему выводить строки только с типом role = test:

 <test>
 <password></password>
 <access_management>0</access_management>
 <networks incl="networks" replace="replace">
 <ip>0.0.0.0/0</ip>
 </networks>
 <profile>default</profile>
 <quota>default</quota>
 <databases>
 <logs>
 <data>
 <filter>role = 'test'</filter>
</data>
 </logs>
 </databases>
 </test>

И теперь попробуем от его имени посмотреть данные в таблице logs.data:

root@ch1:/etc/clickhouse-server# clickhouse-client -u test
ch1.ru-central1.internal :) use logs;
ch1.ru-central1.internal :) select * from data;
┌──────────────────ev─┬─a─┬─role─┐
│ 2021-03-09 12:02:00 │ 3 │ test │
└─────────────────────┴───┴──────┘
1 rows in set. Elapsed: 0.003 sec.
ch1.ru-central1.internal :)

Отлично! Кликхаус выдал нам только одну строку, которая соответствует нашему условию!

Полезные ссылки:

Задание. Правила:

  1. После нажатия кнопки «Начать выполнение» для вас будет подготовлено окружение и предоставлены необходимые доступы.
  2. Также вам будут выданы переменные (если они будут нужны), которые в задании указаны в фигурных скобках, — их надо будет подставить при выполнении задания.
  3. После выполнения всех пунктов задания нажмите кнопку «Отправить на проверку», и в течение ближайших 3-5 минут скрипт проверит выполнение всех условий и выставит вам оценку.
  4. В случае, если вы что-то забыли, можно исправить ошибки и отправить на проверку повторно.
  5. Также, если вы успешно сдали задание, но у вас остались вопросы — вы всегда сможете задать их куратору после проверки или в чате в любое удобное для вас время.

Задание:

  1. Установите clickhouse на сервер из официальных репозиториев.
  2. Все изменения ниже проводите в основном пользовательском файле users.xml
  3. Добавьте нового пользователя с именем ch_user.
  4. Задайте ему пароль ch_password
  5. Отключите данному пользователю управление другими пользователями.
  6. Разрешите доступ для данного пользователя только с 127.0.0.1.
  7. Отправляйте задание на проверку.
  8. Сохраните конфигурацию вашего пользователя ch_user - она потребуется вам в следующем задании.